package mvc;
import java.util.Observable;
import javax.swing.JOptionPane;

/**
 * @author   marcel @date 29/04/2007
 * Classe responsavel pelo processamento dos dados de prontuario
 * vindos da classe Banco de dados
 * Esta ligado a classe ProntuarioController
 * Herda a classe Observable, esta classe possui metodos para
 * avisar outra classe sobre mudancas no objeto.
 */
public class ProntuarioModel extends Observable {
	public static final int FIELD_PRONTUARIO = 0;
	public static final int FIELD_CPF = 1;
	public static final int FIELD_RG = 2;

	private BancoDeDadosInterface bd;
	private String nome,RG,CPF,estadoCivil;
	private String dataNasc, dataCadast;
	private String telefoneRes,telefoneCel,telefoneRec;
	private String endereco,bairro,cidade,estado,CEP;


	private String prontuario;
	//private Vector<String> historico;

	// Construtor
	public ProntuarioModel(BancoDeDadosInterface bd) {
		this.bd=bd;
	}

	/*
	 * (non-Javadoc)
	 * @see mvc2.ModelInterface#busca(java.lang.String)
	 */
	/**
	 * @return   the endereco
	 */
	public String getEndereco() {
		return endereco;
	}

	/**
	 * @return   the nome
	 */
	public String getNome() {
		return nome;
	}

	public void insereCEP(String CEP) {
		if(!hasCEP(CEP))
				bd.addCEP(CEP);
	}

	public boolean hasCEP(String CEP) {
		return bd.buscaCEP(CEP);
	}

	public void removeCEP(String CEP) {
		bd.removeCEP(CEP);
	}

	private boolean validarRG (String RG) {
		final String RG_PATTERN = "\\d\\d\\.\\d\\d\\d\\.\\d\\d\\d-\\d";
		if(RG.matches(RG_PATTERN))
			return true;
		return false;
	}

	private  boolean validarCPF (String CPF) {
		final String CPF_PATTERN = "\\d\\d\\d\\.\\d\\d\\d\\.\\d\\d\\d-\\d\\d";
		int soma1=0,soma2=0;

		//verifica se a entrada do CPF confere
		if(! CPF.matches(CPF_PATTERN)) {
			System.out.println("validarCPF: Formato invalido");
			return false;
		}

		//int j=10;
		//primeiro digito
		int i=0,s;
		for ( char x : CPF.toCharArray()) {
			if(x != '.' && x != '-') {
				s=x - '0'; //tranformando em Inteiro
				soma1+=s*(10-i);
				soma2+=s*(11-i);
				i++;
			}
		}
		//calcula primeiro digito de verificacao
		int resto = soma1%11;
		int digito1 = resto < 2 ? 0 : 11 - resto;

		//calcula segundo digito de verificacao
		s = (CPF.charAt(12) - '0')*2;
		soma2+=s;
		resto = soma2%11;
		int digito2 = resto < 2 ? 0 : 11 - resto;
		return digito1 == CPF.charAt(13) && digito2 == CPF.charAt(13);
	}

	/**
	 * 
	 * @param nome
	 * @param CPF
	 * @param RG
	 * @param endereco
	 * @param bairro
	 * @param cidade
	 * @param estado
	 * @param t1  -telefone residencial
	 * @param t2 - telefone celular
	 * @param t3  - telefone recado
	 * @param CEP
	 * @param dataNasc
	 * @param dataCadast
	 */
	public void addProntuario(String nome, String dataNasc, String CPF, String RG,
			String endereco,String bairro,String cidade,String estado, String t1,
			String t2, String t3, String CEP, String dataCadast,String estadoCivil) {

		boolean adiciona=true;

		/*if(CPF!="")
			if(validarCPF(CPF))
				this.CPF=CPF;
			else {
				this.CPF="CPF invalido";
				adiciona=false;
			}*/

		if(RG!="")
			if(validarRG(RG))
				this.RG=RG;
			else {
				this.RG="RG invalido";
				adiciona=false;
			}

		if(CEP=="") {
			CEP="CEP invalido";
			adiciona=false;
			JOptionPane.showMessageDialog(null, CEP,"Erro", JOptionPane.PLAIN_MESSAGE);			
		}
		else if (!hasCEP(CEP)) {
			CEP="CEP nao consta";
			adiciona=false;
			JOptionPane.showMessageDialog(null, CEP,"Erro", JOptionPane.PLAIN_MESSAGE);
		}

		if(nome == "" || endereco == "") {
			this.nome="Nome invalido";
			this.endereco="Endereco invalido";
			adiciona=false;
		}

		if(adiciona==true) {
			this.nome=nome;
			this.CPF=CPF;
			this.RG=RG;
			this.endereco=endereco;
			this.bairro=bairro;
			this.cidade=cidade;
			this.estado=estado;
			telefoneRes=t1;
			telefoneCel=t2;
			telefoneRec=t3;
			this.CEP=CEP;
			this.dataCadast=dataCadast;
			this.dataNasc=dataNasc;
			this.estadoCivil=estadoCivil;
			prontuario = bd.addProntuario(nome, dataNasc, CPF, RG, endereco,
							bairro, cidade, estado, t1, t2, t3, CEP, dataCadast,estadoCivil);

			setChanged();
			notifyObservers(this);
		}

	} // addProntuario
	/**
	 * @param str String com o valor a ser buscando
	 */
	public void buscaProntuario(String str){
		User rs = bd.buscaProntuario(str);
		prontuario=rs.getProntuario ();
		nome=rs.getNome();
		CPF=rs.getCPF();
		RG=rs.getRG();
		endereco=rs.getEndereco();
		bairro=rs.getBairro();
		cidade=rs.getCidade();
		estado=rs.getEstado();
		telefoneRes=rs.getT1();
		telefoneCel=rs.getT2();
		telefoneRec=rs.getT3();
		CEP=rs.getCEP();
		dataCadast=rs.getDataCadast();
		dataNasc=rs.getDataNasc();
		estadoCivil=rs.getEstadoCivil();

		setChanged();
		notifyObservers(this);
	}//buscaProntuario

	public void removeProntuario(String str) {
		bd.removeProntuario(str);
	}

	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public String getEstadoCivil() {
		return estadoCivil;
	}

	public void setEstadoCivil(String estadoCivil) {
		this.estadoCivil = estadoCivil;
	}

	public String getProntuario() {
		return prontuario;
	}

	public void setProntuario(String prontuario) {
		this.prontuario = prontuario;
	}

	public String getTelefoneCel() {
		return telefoneCel;
	}

	public void setTelefoneCel(String telefoneCel) {
		this.telefoneCel = telefoneCel;
	}

	public String getTelefoneRec() {
		return telefoneRec;
	}

	public void setTelefoneRec(String telefoneRec) {
		this.telefoneRec = telefoneRec;
	}

	public String getTelefoneRes() {
		return telefoneRes;
	}

	public void setTelefoneRes(String telefoneRes) {
		this.telefoneRes = telefoneRes;
	}

	public String getDataCadast() {
		return dataCadast;
	}

	public void setDataCadast(String dataCadast) {
		this.dataCadast = dataCadast;
	}

	public String getDataNasc() {
		return dataNasc;
	}

	public void setDataNasc(String dataNasc) {
		this.dataNasc = dataNasc;
	}

	public String getRG() {
		return RG;
	}

	public void setRG(String rg) {
		RG = rg;
	}

} //ProntuarioModel

